package main

import (
	"fmt"
	"time"
)

func main() {
	//test1()
	//test2()
	//test3()
	//test4()
	// 并发
	chans := make(chan int)
	time.Sleep(2 * time.Second) // 模拟一些工作
	chans <- 42
	fmt.Printf("receive chans %d\n", <-chans)
	time.Sleep(1 * time.Second)
}
func test1() {
	// 创建一个无缓冲的 channel
	ch := make(chan int)

	// 启动一个 goroutine，发送数据到 channel
	go func() {
		time.Sleep(2 * time.Second) // 模拟一些工作
		ch <- 42                    // 发送数据到 channel
	}()

	// 在主 goroutine 中从 channel 接收数据
	fmt.Println("Received:", <-ch) // 接收并打印数据
}

func test2() {

	// 创建一个无缓冲的 channel
	ch := make(chan string)

	// 启动一个 goroutine，发送数据到 channel
	go func() {
		time.Sleep(2 * time.Second) // 模拟一些工作
		ch <- "测试推送"                // 发送数据到 channel
	}()

	go func() {
		// 在主 goroutine 中从 channel 接收数据
		fmt.Println("Received:", <-ch) // 接收并打印数据
	}()

	time.Sleep(3 * time.Second)
}

// 无缓冲区，测试发送方阻塞
func test3() {
	// 创建一个无缓冲的 channel
	ch := make(chan string)
	println("准备阶段")
	go func() {
		println("接收方延时2s")
		time.Sleep(2 * time.Second) // 模拟一些工作
		// 在主 goroutine 中从 channel 接收数据
		println("接收方准备接收")
		fmt.Println("Received:", <-ch) // 接收并打印数据
		println("接收方接收完毕")
	}()
	println("发送方准备发送")
	ch <- "无缓冲区推送，等待接收方准备好"
	println("发送方准备完毕")
	time.Sleep(1 * time.Second)
	// 结论 等待接收方才会发送
}

// 带缓冲区 chan
func test4() {

}
